:- consult('Lexikon.pl').

% Copyright by:
% Brooks, Philip (2003) SCP: A Simple Chunk Parser. University of Georgia. http://www.ai.uga.edu/mc/ProNTo. 


% chunk_parse(+Stream, -Rest, -Text) :-
%   parst einen Chunk aus der Liste Stream mit parse/4,
%   die Eingabevariable Stream ist eine Liste aus Woertern,
%   Rest ist der Rest ohne den geparsten Chunk

chunk_parse(Stream,Rest,Text) :-
   parse(chunk,Stream,Rest,Text),
   !.


% chunk_parse_text(+Stream) :-
%   ruft chunk_parse/3 auf bis der Stream von Woertern
%   aufgebraucht ist,
%   ruft show_tree/1 auf und gibt die eingerueckte Baumstruktur
%   aus

chunk_parse_text(S) :-
   chunk_parse(S,Rest,Tree),
   % show_text(Tree), % statt show_tree/1 - gibt Textstruktur aus
   show_tree(Tree),
   chunk_parse_text(Rest).

chunk_parse_text([]).


% chunk_parse_text(+Stream,-List) :-
%   ruft chunk_parse/3 auf bis List mit den Chunks
%   gefuellt ist

chunk_parse_text(Stream,[Chunk|List]) :-
   chunk_parse(Stream,Rest,Chunk),
   chunk_parse_text(Rest,List).

chunk_parse_text([],[]).


% show_tree(+Tree) :-
%   gibt den Baum Tree als eingerueckte Struktur aus

show_tree(Tree) :-
   show_tree_x(Tree,0).

show_tree_x(Atom,N) :-
   atomic(Atom),
   !,
   write_spaces(N),
   write(Atom),
   nl.

show_tree_x(Tree,N) :-
   NewN is N + 3,
   functor(Tree,Functor,Args),
   show_tree_x(Functor,N),
   between(1,Args,X),
   arg(X,Tree,Item),
   show_tree_x(Item,NewN),
   fail.
   show_tree_x(_,_).


% write_spaces(+Num) :-
%   schreibt Leerzeichen
%   die Anzahl der Leerzeichen ist Num

write_spaces(X) :-
   X >= 0,
   write_spaces_x(X).

write_spaces_x(0) :- !.

write_spaces_x(N) :-
   write(' '),
   NewN is N - 1,
   write_spaces_x(NewN).


% parse(?Category, +Stream, ?Rest, -Text) :-
%   parst ein Wort des Typs Category,
%   vom Beginn des Streams,
%   Rest ist der Rest des Streams ohne den ersten Chunk

% Category ist ein Wort in word/2
parse(Category,[Word|Stream],Stream,Text) :-
   word(Category,Word),
   functor(Text,Category,1),
   arg(1,Text,Word).

% Category gehoert zu einer Regel in rule/2
parse(Category,Stream,Rest,Text) :-
   rule(Category,Cs),
   parse_list(Cs,Stream,Rest,List),
   Text =.. [Category|List].

% Category ist eine optionale Phrase
parse_list([[Category]|Cs],Stream,Rest,[Text|List]) :-
   parse(Category,Stream,Stream1,Text),
   parse_list(Cs,Stream1,Rest,List).

% restliche optionale Worte ignorieren
parse_list([[_]|Cs],Stream,Rest,List) :-
   !,
   parse_list(Cs,Stream,Rest,List).

% Category ist eine Phrase
parse_list([Category|Cs],Stream,Rest,[Text|List]) :-
   parse(Category,Stream,Stream1,Text),
   parse_list(Cs,Stream1,Rest,List).

% Abbruchbedingung
parse_list([],Stream,Stream,[]).


% flatten_chunks(+Chunks, -List) :-
%   formt die Liste aus Chunks in eine flache Liste um

flatten_chunks(Chunks,List) :-
   maplist(flatten_chunk,Chunks,List).


% flatten_chunk(+Chunk, -Flat) :-
%   ruft flatten_chunk/3 auf ohne die dritte Variable,
%   nimmt die Woerter aus der Liste Chunk und
%   formt diese in eine flache Liste Flat um

flatten_chunk(Chunk,Flat) :-
   flatten_chunk(Chunk,Flat,_).


% flatten_chunk(+Chunk, -Flat, -Type) :-
%   nimmt die Woerter aus der Liste Chunk und
%   formt diese in eine flache Liste Flat um und
%   gibt den Typ des Chunks in Type zurueck

flatten_chunk(chunk(Struc),Flat,Type) :-
   Struc =.. [Type|List],
   flatten_chunk_x(List,Flat).

flatten_chunk_x([H|T], [H|FT]) :-
   atomic(H),
   !,
   flatten_chunk_x(T,FT).

flatten_chunk_x([H|T], Flat) :-
   H =.. [_|List],
   flatten_chunk_x(List,FH),
   flatten_chunk_x(T,FT),
   append(FH,FT,Flat).

flatten_chunk_x([],[]).


% the following lines of code are under the gpl 3

% Copyright 2012 Beatrice Florat, beatrice.florat <at> googlemail <dot> com

% This file is part of Einfacher Chunk Parser.

% Einfacher Chunk Parser is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.

% Einfacher Chunk Parser is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.

% You should have received a copy of the GNU General Public License
% along with Einfacher Chunk Parser. If not, see <http://www.gnu.org/licenses/>.


% show_text(+Text) :-
%  gibt den eingebenen Text als einzelne Chunks aus

show_text(Text) :-
   show_text_x(Text).

show_text_x(Text) :-
   functor(Text,Functor,Args),
   between(1,Args,X),
   arg(X,Text,Item),
   write(' '),
   write_text(Functor,Item),
   fail.
   
show_text_x(_).

% unrecognized_words werden ohne Markierung
% wieder ausgegeben
write_text(_,unrecognized_word(X)) :-
   write(X),!.

write_text(F,A) :-
   F == chunk,
   write([A]).

